#include <iostream>
#include<string>
#include<vector>
#include<stack>
#include<list>
#include<queue>
using namespace std;

//////int main()
//////{
////////  string d1("hello");
////////
////////  //begin,end
////////  string::iterator it =d1.begin();
////////  string::const_iterator cit=d1.begin();
////////  //rbegin/rend
////////  string::reverse_iterator rit=d1.rbegin();
////////  string::const_reverse_iterator crit=d1.rbegin();
//////
//////        string d1("hello");
//////
//////        d1+'1';
//////        cout<<d1;
//////
//////
//////}
////int main()
////{
////
////    int arr[]={1,2,3};
////   list<int>d1;//默认构造
////    list<int>d2(10,1);//n个这个值
////    list<int>d3(arr,arr+3);//迭代器区间
////    list<int>d4(d2);//拷贝构造
////
////
////    return 0;
////}
//
////第一版，stack top越界
//class Solution {
//public:
//    stack<int>d1;
//    bool IsPopOrder(vector<int> pushV,vector<int> popV)
//    {
//        d1.push(pushV[0]);
//        auto itV=pushV.begin()+1;//先走一步导致的
//        int index=0;
//        while(itV!=pushV.end()||popV.size()!=index)
//        {
//            while(!d1.empty()&&d1.top()==popV[index])
//            {
//                d1.pop();
//                index++;
//            }
//            if(itV==pushV.end())
//                break;
//            d1.push(*itV++);
//        }
//
//        return d1.empty();
//    }
//
//
//    //如果栈顶的数据与popv一样则出栈
//    //如果不一样就pushv入栈
//    //如果不一样且pushv为’空‘那么就false
//    //如果popv为‘空’则为true
//};
////版本二优
//class Solution
//        {
//public:
//    stack<int>d1;
//    bool IsPopOrder(vector<int> pushV,vector<int> popV)
//    {
//        int indexs=0,indexp=0;
//        while(indexs!=pushV.size())
//        {
//            d1.push(pushV[indexs++]);
//            while(!d1.empty()&&d1.top()==popV[indexp])
//            {
//                d1.pop();
//                indexp++;
//            }
//        }
//
//
//        return d1.empty();
//    }
//
//
//    //如果栈顶的数据与popv一样则出栈
//    //如果不一样就pushv入栈
//    //如果不一样且pushv为’空‘那么就false
//    //如果popv为‘空’则为true
//};



//问题size()会更新
//class MyStack {
//public:
//    queue<int>d1;
//    queue<int>d2;
//
//    MyStack()
//    {
//
//    }
//
//    void number(int &ret, queue<int> &empty,queue<int> &have)
//    {
//        int i=0;
//        int sz=have.size()-1;
//        while(i<sz)
//        {
//            empty.push(have.front());
//            have.pop();
//            i++;
//        }
//        ret=have.front();
//        have.pop();
//    }
//    void push(int x)//入数据
//    {
//        if(d1.empty())
//        {
//            d1.push(x);
//        }
//
//
//    }
//
//    int pop() //出数据
//    {
//        int ret=0;
//        number(ret,d2,d1);
//
//        return ret;
//    }
//
//    int top()
//    {
//
//        int ret=0;
//        if(d1.empty())
//        {
//            ret=d2.back();
//        }
//        else
//        {
//            ret=d1.back();
//        }
//        return ret;
//
//    }
//
//    bool empty()
//    {
//        return d1.empty()&&d2.empty();
//
//    }
//    //俩个队列来回倒
//    //n-1个数据，那么他的头一定就是那个栈的顶
//};




//进阶写法
class MyStack {
private:
queue<int>d1;
public:


    MyStack()
    {

    }

    void push(int x)
    {
        d1.push(x);
        int sz=1;
        while(sz--)//直接模拟了栈
        {
            int value=d1.front();
            d1.pop();
            d1.push(value);
        }

    }

    int pop()
    {
       int ret =d1.front();
       d1.pop();
       return ret;
    }

    int top()
    {
       return d1.front();

    }

    bool empty()
    {
        return d1.empty();

    }
};
int main()
{

    MyStack d1;
    d1.push(1);
    d1.push(2);
    cout<<d1.pop()<<' ';
    cout<<d1.pop()<<' ';
}
